#include <iostream>
#include <cstring>
#include <cassert>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
using std::endl;
using std::cout;

// // 封装文件描述符
// #define NUM 1024
// struct Myfile_
// {
//     int fd;
//     char buffer[NUM];
//     int end; // 当前缓冲区的结尾
// };
// typedef struct Myfile_  Myfile;

// Myfile* fopen_(const char* pathname, const char* mode)
// {
//     assert(pathname);
//     assert(mode);

//     Myfile* fp = nullptr;
//     if (strcmp(mode, "w") == 0)
//     {
//         int fd = open(pathname, O_WRONLY | O_TRUNC | O_CREAT, 0666);
//         if (fd >= 0)
//         {
//             fp = (Myfile*) new (Myfile);
//             memset(fp, 0, sizeof(fp));
//             fp->fd = fd;
//         }
//     }
//     else if (strcmp(mode, "r") == 0)
//     {
//         int fd = open(pathname, O_RDONLY);
//         if (fd >= 0)
//         {
//             fp = (Myfile*)new (Myfile);
//             memset(fp, 0, sizeof(fp));
//             fp->fd = fd;
//         }
//     }
//     return fp;
// }

// void fputs_(const char* message, Myfile* fp)
// {
//     assert(message);
//     assert(fp);
//     strcpy(fp->buffer + fp->end, message);
//     fp->end += strlen(message);
//     cout << fp->buffer << endl;  // 目前还没有写入文件,数据在缓冲区中

//     if (fp->fd == 1) // 标准输出
//     {
//         if (fp->buffer[fp->end - 1] == '\n')
//         {
//             write(fp->fd, fp->buffer, fp->end);
//             fp->end = 0;
//         }
//     }
// }

// void fflush_(Myfile* fp)
// {
//     assert(fp);
//     if (fp->end != 0)
//     {
//         write(fp->fd, fp->buffer, fp->end); // 把数据写进内核
//         syncfs(fp->fd); // 把数据写入磁盘
//         fp->end = 0;
//     }
// }

// void fclose_(Myfile* fp)
// {
//     assert(fp);
//     fflush_(fp);
//     close(fp->fd);
//     delete fp;
// }

// int main()
// {
//     Myfile* fp = fopen_("./log.txt", "w");
//     if (fp == nullptr)
//     {
//         perror("fopen error!");
//         exit(1);
//     }
//     fputs_("one hello zhanfeng", fp);

//     fork();

//     fclose_(fp);
//     return 0;
// }



// 写入标准错误
void myperror(const char* s)  // 实现标准错误接口
{
    assert(s);
    fprintf(stderr, "%s: %s\n", s, strerror(errno));
}

int main()
{
    // stdout -> 1
    fprintf(stdout, "hello stdout\n");

    // stderr -> 2
    fprintf(stderr, "hello stderr\n");

    const char* s1 = "hello write 1\n";
    const char* s2 = "hello write 2\n";

    write(1, s1, strlen(s1));
    write(2, s2, strlen(s2));

    cout << "hello cout" << endl; // -> 1
    std::cerr << "hello cerr" << endl; // -> 2

    int fd = open("log1.txt", O_RDONLY);
    if (fd < 0)
    {
        myperror("open error");  // 使用自己的接口
    }
}
